library(tigris)
library(tidyverse)
library(tidyquant)
library(leaflet)
library(highcharter)
library(readxl)
states <- states(cb = TRUE, class = "sf")

Here’s a data import and wrangling exercise. Our purpose is to take an excel file of the housing price index (hpi) for the 50 states since 1975 and get into a format that can be used to visualize the data using ggplot, highcharter and leaflet.

For ggplot we’ll need to get this excel data into a data.frame or tibble with an appropriate date column.

For highcharter, we’ll need an xts object.

view(states_hpi)
Error in view(states_hpi) : could not find function "view"
states_wrangled_ggplot <- 
  states_hpi %>% 
  # remove confusing metadata
  slice(-508:-523) %>% 
  # add nice date column
  mutate(Date = seq(mdy('01/31/1975'), mdy('03/31/2017'), by = 'months')) %>%
  # remove the month column, move date column to be first
  select(Date, everything(), -Month) %>% 
  ##gather from wide to long format
  gather(state, hpi, -Date) %>%
  ##round hpi to four digits
  mutate(hpi = round(hpi, digits = 4)) %>%
  ##create a column called year and month by separating the date column
  #separate(date, into = c("year", "month"), sep = '-', convert = TRUE, remove = FALSE) %>% 
  ##create new column: hpa, hpa12, hpa3 etc.
  mutate(
         hpa = ((1+ (hpi-lag(hpi))/hpi)^12) - 1, 
         hpa12 = ((1+ (hpi-lag(hpi, 12))/hpi)^1) - 1, 
         hpa3 = ((1+ (hpi-lag(hpi, 3))/hpi)^4) - 1,
         hpi12 = lag(hpi, 12), 
         hpi12min = rollapply(hpi, 12, min, fill = NA, na.rm = FALSE, align = 'right'),
         hpi12max = rollapply(hpi, 12, max, fill = NA, na.rm = FALSE, align = 'right'))
head(states_hpa_leaflet$NAME)
[1] "Alaska"         "Alabama"        "Arkansas"       "American Samoa" "Arizona"       
[6] "California"    
# Build states map
statesPal<-colorNumeric(
  palette = "GnBu",
  domain = states_hpa_leaflet$hpa)
statesPopup <- paste0( 
                    states_hpa_leaflet$NAME,
                    "<br>Annual House Price Percent Change: ", 
                     states_hpa_leaflet$hpa, "%")
leaf_states <- 
  leaflet(states_hpa_leaflet) %>% 
  addProviderTiles("CartoDB.Positron") %>%   
  setView(-95, 40, zoom = 4) %>% 
  addPolygons(stroke = TRUE, color = "black", weight = .4, opacity = 1.0, 
              smoothFactor = 0.5, fill = TRUE, fillColor = ~statesPal(hpa), 
              fillOpacity = .8, layerId = ~STUSPS, popup = statesPopup)
leaf_states
states_hpi_highcharter <-
  states_hpi %>% 
  # remove confusing metadata
  slice(-508:-523) %>% 
  # add nice date column
  mutate(Date = seq(mdy('01/31/1975'),mdy('03/31/2017'), by = 'months')) %>%
  # remove the month column, move date column to be first
  select(Date, everything(), -Month) 
# We need to convert to xts before calling highcharter. 
states_hpi_xts <- states_hpi_highcharter %>% 
  as_xts(date_col = Date)
Error in parse(text = x) : <text>:1:8: unexpected symbol
1: United States
           ^
save(leaf_states, file = "leaflet_states.RDat")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQpsaWJyYXJ5KHRpZ3JpcykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeXF1YW50KQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkoaGlnaGNoYXJ0ZXIpCmxpYnJhcnkocmVhZHhsKQpgYGAKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9CnN0YXRlcyA8LSBzdGF0ZXMoY2IgPSBUUlVFLCBjbGFzcyA9ICJzZiIpCmBgYAoKSGVyZSdzIGEgZGF0YSBpbXBvcnQgYW5kIHdyYW5nbGluZyBleGVyY2lzZS4gT3VyIHB1cnBvc2UgaXMgdG8gdGFrZSBhbiBleGNlbCBmaWxlIG9mIHRoZSBob3VzaW5nIHByaWNlIGluZGV4IChocGkpIGZvciB0aGUgNTAgc3RhdGVzIHNpbmNlIDE5NzUgYW5kIGdldCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBkYXRhIHVzaW5nIGdncGxvdCwgaGlnaGNoYXJ0ZXIgYW5kIGxlYWZsZXQuCgpGb3IgYGdncGxvdGAgd2UnbGwgbmVlZCB0byBnZXQgdGhpcyBleGNlbCBkYXRhIGludG8gYSBkYXRhLmZyYW1lIG9yIHRpYmJsZSB3aXRoIGFuIGFwcHJvcHJpYXRlIGRhdGUgY29sdW1uLiAKCkZvciBgaGlnaGNoYXJ0ZXJgLCB3ZSdsbCBuZWVkIGFuIGB4dHNgIG9iamVjdC4gCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CgojIExvYWQgaW4gZGF0YSBmcmFtZSBvZiBob3VzaW5nIHByaWNlIGluZGV4IGZvciBhbGwgNTAgc3RhdGVzCiMgUGx1cyB0aGUgbmF0aW9uYWwgYXZlcmFnZQojc3RhdGVzX2hwaSA8LSAKICMgUXVhbmRsKCJGTUFDL0hQSSIsIG9yZGVyID0gJ2FzYycpCgojIFVzZSB0aGUgSW1wb3J0IERhdGFzZXQgYnV0dG9uIHRvIHNob3cgaG93IHRvIGRvIHNvbWUgCiMgcHJlLXNvcnRpbmcuIEFmdGVyIGltcG9ydCwgd2UnbGwgaGF2ZSBhIGRhdGEuZnJhbWUgb2JqZWN0CiMgdGhhdCBzdGlsbCBuZWVkcyB3b3JrIC0gd2UnbGwgd3JhbmdsZSBpdCBpbnRvIHNoYXBlLgpzdGF0ZXNfaHBpIDwtIHJlYWRfZXhjZWwoInN0YXRlc19ocGkueGxzIiwgCiAgICBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIAogICAgICAgICJudW1lcmljIiwgInNraXAiLCAic2tpcCIpLCBuYSA9ICJOQSIsIHNraXAgPSA1KQoKIyBUYWtlIGEgbG9vayBhdCB0aGUgc3RhdGVzX2hwaSBvYmplY3QuIAojIFRoZSBkYXRhIGNvbHVtbiBpcyBjYWxsZWQgIm1vbnRoIiwgaXQncyB0ZXJyaWJseSwgdW51c2FibHkgZm9ybWF0dGVkLgojIFdlJ2xsIHVzZSBgbXV0YXRlYCB0byBjcmVhdGUgYSAnZGF0ZScgY29sdW1uLgojIFRoZXJlIGFyZSAxNSByb3dzIG9mIG1ldGFkYXRhIGF0IHRoZSBib3R0b20uIE5lZWQgdG8gcmVtb3ZlIHRob3NlIHdpdGggYHNsaWNlYAoKc3RhdGVzX2hwaV93cmFuZ2xlZF9sZWFmbGV0IDwtIAogIHN0YXRlc19ocGkgJT4lIAogICMgcmVtb3ZlIGNvbmZ1c2luZyBtZXRhZGF0YQogIHNsaWNlKC01MDg6LTUyMykgJT4lIAogICMgYWRkIG5pY2UgZGF0ZSBjb2x1bW4KICBtdXRhdGUoRGF0ZSA9IHNlcShtZHkoJzAxLzMxLzE5NzUnKSxtZHkoJzAzLzMxLzIwMTcnKSwgYnkgPSAnbW9udGhzJykpICU+JQogICMgcmVtb3ZlIHRoZSBtb250aCBjb2x1bW4sIG1vdmUgZGF0ZSBjb2x1bW4gdG8gYmUgZmlyc3QKICBzZWxlY3QoRGF0ZSwgZXZlcnl0aGluZygpLCAtTW9udGgpICU+JSAKICAjIEZpbHRlciB0byBqdXN0IHRoZSBsYXN0IHllYXIgKE1hcmNoIHRvIE1hcmNoKQogIGZpbHRlcihEYXRlID09IHltZCgiMjAxNi0wMy0zMSIpIHwgRGF0ZSA9PSB5bWQoIjIwMTctMDMtMzEiKSkgJT4lIAogICMgQ2hhbmdlIHRvIGxvbmcgZm9ybWF0CiAgZ2F0aGVyKHN0YXRlLCB2YWx1ZSwgLURhdGUpICU+JSAKICAjIEdyb3VwZCBieSBzdGF0ZQogIGdyb3VwX2J5KHN0YXRlKSAlPiUKICAjIEFkZCBhbm51YWwgcHJpY2UgYXBwcmVjaWF0aW9uIHZhbHVlIHdpdGggbXV0YXRlIGFuZCBsYWcgZnVuY3Rpb24KICBtdXRhdGUoaHBhID0gKHZhbHVlIC0gbGFnKHZhbHVlKSkvIGxhZyh2YWx1ZSkpICU+JQogICMgUm91bmQgdGhhdCBuZXcgdmFsdWUKICBtdXRhdGUoaHBhID0gcm91bmQoaHBhLCBkaWdpdHMgPSAzKSAqIDEwMCkgICU+JSAKICAjIGdvb2QgcHJhY3RpY2UgdG8gZ2V0IHJpZCBvZiBhbnkgTkFzLCB1bmxlc3MgdGhvc2UgYXJlIGltcG9ydGFudCB0byBpZGVudGlmeQogIG5hLm9taXQoKSAlPiUgCiAgIyBHZXQgcmlkIGFsbCBleGNlcHQgc3RhdGUgYW5kIEhQQS4gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdC4KICBzZWxlY3Qoc3RhdGUsIGhwYSkgJT4lIAogICMgUmVuYW1lIHRoZSBjb2x1bW4/IFdoeSBpbiB0aGUgd29ybGQgY2hvb3NlIFNUVVNQUz8gCiAgIyBTbyB3ZSBjYW4gYWRkIGl0IHRvIG91ciBzaGFwZWZpbGUvbWFwCiAgcmVuYW1lKFNUVVNQUyA9IHN0YXRlKQoKYGBgCgpgYGB7cn0Kc3RhdGVzX3dyYW5nbGVkX2dncGxvdCA8LSAKICBzdGF0ZXNfaHBpICU+JSAKICAjIHJlbW92ZSBjb25mdXNpbmcgbWV0YWRhdGEKICBzbGljZSgtNTA4Oi01MjMpICU+JSAKICAjIGFkZCBuaWNlIGRhdGUgY29sdW1uCiAgbXV0YXRlKERhdGUgPSBzZXEobWR5KCcwMS8zMS8xOTc1JyksIG1keSgnMDMvMzEvMjAxNycpLCBieSA9ICdtb250aHMnKSkgJT4lCiAgIyByZW1vdmUgdGhlIG1vbnRoIGNvbHVtbiwgbW92ZSBkYXRlIGNvbHVtbiB0byBiZSBmaXJzdAogIHNlbGVjdChEYXRlLCBldmVyeXRoaW5nKCksIC1Nb250aCkgJT4lIAogICMjZ2F0aGVyIGZyb20gd2lkZSB0byBsb25nIGZvcm1hdAogIGdhdGhlcihzdGF0ZSwgaHBpLCAtRGF0ZSkgJT4lCiAgIyNyb3VuZCBocGkgdG8gZm91ciBkaWdpdHMKICBtdXRhdGUoaHBpID0gcm91bmQoaHBpLCBkaWdpdHMgPSA0KSkgJT4lCiAgIyNjcmVhdGUgbmV3IGNvbHVtbjogaHBhLCBocGExMiwgaHBhMyBldGMuCiAgbXV0YXRlKAogICAgICAgICBocGEgPSAoKDErIChocGktbGFnKGhwaSkpL2hwaSleMTIpIC0gMSwgCiAgICAgICAgIGhwYTEyID0gKCgxKyAoaHBpLWxhZyhocGksIDEyKSkvaHBpKV4xKSAtIDEsIAogICAgICAgICBocGEzID0gKCgxKyAoaHBpLWxhZyhocGksIDMpKS9ocGkpXjQpIC0gMSwgCiAgICAgICAgIGhwaTEyID0gbGFnKGhwaSwgMTIpLCAKICAgICAgICAgaHBpMTJtaW4gPSByb2xsYXBwbHkoaHBpLCAxMiwgbWluLCBmaWxsID0gTkEsIG5hLnJtID0gRkFMU0UsIGFsaWduID0gJ3JpZ2h0JyksCiAgICAgICAgIGhwaTEybWF4ID0gcm9sbGFwcGx5KGhwaSwgMTIsIG1heCwgZmlsbCA9IE5BLCBuYS5ybSA9IEZBTFNFLCBhbGlnbiA9ICdyaWdodCcpKSAlPiUgCiAgIyNjcmVhdGUgYSBjb2x1bW4gY2FsbGVkIHllYXIgYW5kIG1vbnRoIGJ5IHNlcGFyYXRpbmcgdGhlIGRhdGUgY29sdW1uCiAgc2VwYXJhdGUoZGF0ZSwgaW50byA9IGMoInllYXIiLCAibW9udGgiKSwgc2VwID0gJy0nLCBjb252ZXJ0ID0gVFJVRSwgcmVtb3ZlID0gRkFMU0UpICU+JQpgYGAKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyMgV29yayB3aXRoIGRhdGEgZnJvbSAxOTk5LTIwMTcKc3RhdGVzX3Bvc3RfMTk5MCA8LSAKICBzdGF0ZXNfd3JhbmdsZWRfZ2dwbG90ICU+JQogIGZpbHRlcihEYXRlID49ICIxOTkwLTAxLTAxIiAmIERhdGUgPD0gIjIwMTAtMDEtMDEiKQoKIyBEcm9wIHRoZSBzdGF0ZXNfcG9zdF8xOTkwIG9iamVjdCBpbnRvIHRoZSBhIGdncGxvdAoKaHBhX2dncGxvdCA8LSAKICBnZ3Bsb3Qoc3RhdGVzX3Bvc3RfMTk5MCwgYWVzKERhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gaHBhKSwgY29sb3VyID0gImJsdWUiKSArCiAgI2dlb21fbGluZShhZXMoeT1ocGkxMm1heCksIGNvbG91ciA9ICJyZWQiKSArCiAgI2dlb21fcG9pbnQoZGF0YSA9IHN1YnNldChzdGF0ZXNfcG9zdF8xOTkwLCBEYXRlID09ICIyMDA4LTA1LTMxIiksIAogICAjICAgICAgICAgIGFlcyh4ID0gRGF0ZSwgeSA9IGhwYSksIGNvbG9yID0gImdyZWVuIiwgYWxwaGEgPSAwLjcpICsKICB5bGFiKCJIb3VzaW5nIFByaWNlIEluZGV4IikgKwogICNmYWNldF93cmFwKH5zdGF0ZSwgbmNvbCA9IDEwKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkKCmhwYV9nZ3Bsb3QKZ2dwbG90bHkoaHBhX2dncGxvdCkKYGBgCgoKYGBge3J9CiMgTm93IHdlIHdhbnQgdG8gbWVyZ2UgYnkgYSBjb21tb24gY29sdW1uIG5hbWUuIApzdGF0ZXNfaHBhX2xlYWZsZXQgPC0gbWVyZ2Uoc3RhdGVzLCBzdGF0ZXNfaHBpX3dyYW5nbGVkLCBieSA9ICJTVFVTUFMiLCBhbGwueCA9IFRSVUUpCiMgVGhlcmUncyBub3cgYSBjb2x1bW4gaW4gb3VyIG1hcCBjYWxsZWQgaHBhLiBXaHkgaXMgdGhlcmUgYW4gTkE/IApoZWFkKHN0YXRlc19ocGFfbGVhZmxldCRocGEpCmhlYWQoc3RhdGVzX2hwYV9sZWFmbGV0JE5BTUUpCiMgVGhlcmUncyBhbiBOQSBiZWN1YXNlIEFtZXJpY2FuIFNvbW9hIGlzIG5vdCBhIHN0YXRlIGFuZCB3ZSBvbmx5IGRhdGEgYWJvdXQgc3RhdGVzLiBUaGF0IE5BIGlzIG5vdCBnb2luZwojaHVydCB1cy4gSW5zdGVhZCwgaXQgd29uJ3QgZ2V0IGEgbmljZSBjb2xvciBvbiB0aGUgbWFwLiBXaHkgZWxzZSBpcyB0aGF0IGhlbHBmdWw/IElmIG1pc3NlZCBhIHN0YXRlLCBpdCAKIyB3b3VsZCBiZSBncmV5LgpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDEwLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBCdWlsZCBzdGF0ZXMgbWFwCnN0YXRlc1BhbDwtY29sb3JOdW1lcmljKAogIHBhbGV0dGUgPSAiR25CdSIsCiAgZG9tYWluID0gc3RhdGVzX2hwYV9sZWFmbGV0JGhwYSkKCnN0YXRlc1BvcHVwIDwtIHBhc3RlMCggCiAgICAgICAgICAgICAgICAgICAgc3RhdGVzX2hwYV9sZWFmbGV0JE5BTUUsCiAgICAgICAgICAgICAgICAgICAgIjxicj5Bbm51YWwgSG91c2UgUHJpY2UgUGVyY2VudCBDaGFuZ2U6ICIsIAogICAgICAgICAgICAgICAgICAgICBzdGF0ZXNfaHBhX2xlYWZsZXQkaHBhLCAiJSIpCgpsZWFmX3N0YXRlcyA8LSAKICBsZWFmbGV0KHN0YXRlc19ocGFfbGVhZmxldCkgJT4lIAogIGFkZFByb3ZpZGVyVGlsZXMoIkNhcnRvREIuUG9zaXRyb24iKSAlPiUgICAKICBzZXRWaWV3KC05NSwgNDAsIHpvb20gPSA0KSAlPiUgCiAgYWRkUG9seWdvbnMoc3Ryb2tlID0gVFJVRSwgY29sb3IgPSAiYmxhY2siLCB3ZWlnaHQgPSAuNCwgb3BhY2l0eSA9IDEuMCwgCiAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC41LCBmaWxsID0gVFJVRSwgZmlsbENvbG9yID0gfnN0YXRlc1BhbChocGEpLCAKICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC44LCBsYXllcklkID0gflNUVVNQUywgcG9wdXAgPSBzdGF0ZXNQb3B1cCkKCmxlYWZfc3RhdGVzCmBgYAoKCmBgYHtyfQpzdGF0ZXNfaHBpX2hpZ2hjaGFydGVyIDwtCiAgc3RhdGVzX2hwaSAlPiUKICBzZWxlY3QoLTUzKSAlPiUgCiAgIyByZW1vdmUgY29uZnVzaW5nIG1ldGFkYXRhCiAgc2xpY2UoLTUwODotNTIzKSAlPiUgCiAgIyBhZGQgbmljZSBkYXRlIGNvbHVtbgogIG11dGF0ZShEYXRlID0gc2VxKG1keSgnMDEvMzEvMTk3NScpLG1keSgnMDMvMzEvMjAxNycpLCBieSA9ICdtb250aHMnKSkgJT4lCiAgIyByZW1vdmUgdGhlIG1vbnRoIGNvbHVtbiwgbW92ZSBkYXRlIGNvbHVtbiB0byBiZSBmaXJzdAogIHNlbGVjdChEYXRlLCBldmVyeXRoaW5nKCksIC1Nb250aCkgCgojIFdlIG5lZWQgdG8gY29udmVydCB0byB4dHMgYmVmb3JlIGNhbGxpbmcgaGlnaGNoYXJ0ZXIuIApzdGF0ZXNfaHBpX3h0cyA8LSAKICBzdGF0ZXNfaHBpX2hpZ2hjaGFydGVyICU+JSAKICBhc194dHMoZGF0ZV9jb2wgPSBEYXRlKQoKIyBXZSBkb24ndCBuZWVkIHRvLCBidXQgaWYgd2UgbmVlZGVkIHRvIGdvIGJhY2sgdG8gYSB0aWJibGUvZGF0YSBmcmFtZT8gCnN0YXRlc19iYWNrX3RvX3RpYmJsZSA8LSAKICBzdGF0ZXNfaHBpX3h0cyAlPiUgCiAgYXNfdGliYmxlKHByZXNlcnZlX3Jvd19uYW1lcyA9IFRSVUUpICU+JQogIG11dGF0ZShkYXRlID0geW1kKHJvdy5uYW1lcykpICU+JSAKICBzZWxlY3QoLXJvdy5uYW1lcykgJT4lIAogIHNlbGVjdChkYXRlLCBldmVyeXRoaW5nKCkpCgpoaWdoY2hhcnQodHlwZSA9ICJzdG9jayIpICU+JQogIGhjX3RpdGxlKHRleHQgPSAiQ2FsaWZvcm5pYSBhbmQgR2VvcmdpYSBIUEkiKSAlPiUKICBoY19hZGRfc2VyaWVzKHN0YXRlc19ocGlfeHRzJEdBLCBuYW1lID0gIkdlb3JnaWEgSFBJIiwgY29sb3IgPSAnYmx1ZScpICU+JQogIGhjX2FkZF9zZXJpZXMoc3RhdGVzX2hwaV94dHMkQ0EsIG5hbWUgPSAiQ2FsaWZvcm5pYSBIUEkiLCBjb2xvciA9ICdncmVlbicpICU+JQogICAgIyBJIGRvbid0IGxpa2UgdGhlIGxvb2sgb2YgdGhlIG5hdmlnYXRvci9zY3JvbGxiYXIsIGJ1dCB5b3UgbWlnaHQuIAogICAgIyBDaGFuZ2UgdGhlc2UgdG8gZW5hYmxlZCA9IFRSVUUgYW5kIGNoZWNrIG91dCB0aGUgcmVzdWx0cy4KICBoY19uYXZpZ2F0b3IoZW5hYmxlZCA9IEZBTFNFKSAlPiUgCiAgaGNfc2Nyb2xsYmFyKGVuYWJsZWQgPSBGQUxTRSkKCmBgYAoKYGBge3J9CnNhdmUobGVhZl9zdGF0ZXMsIGZpbGUgPSAibGVhZmxldF9zdGF0ZXMuUkRhdCIpCmBgYAoK